// https://leetcode.cn/problems/two-sum/

package main

import (
	"fmt"
)

// 给你两个 非空 的链表，表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的，并且每个节点只能存储 一位 数字。
// 请你将两个数相加，并以相同形式返回一个表示和的链表。
// 示例 1：
// 输入：l1 = [2,4,3], l2 = [5,6,4]
// 输出：[7,0,8]
// 解释：342 + 465 = 807.你可以假设除了数字 0 之外，这两个数都不会以 0 开头。

// Definition for singly-linked list.
type ListNode struct {
	Val  int
	Next *ListNode
}

func (head *ListNode) Init(nums []int) {
	cur := head
	for _, v := range nums {
		cur.Next = &ListNode{Val: v, Next: nil}
		cur = cur.Next
	}
}

func (head *ListNode) Show() {
	cur := head
	for cur != nil {
		fmt.Printf("%v -> ", cur.Val)
		cur = cur.Next
	}
	fmt.Println()
}

func addTwoNumbers(l1, l2 *ListNode) *ListNode {
	res := &ListNode{}
	cur, carry := res, 0
	for l1 != nil || l2 != nil || carry != 0 {
		if l1 == nil {
			l1 = &ListNode{}
		}
		if l2 == nil {
			l2 = &ListNode{}
		}
		sum := l1.Val + l2.Val + carry
		cur.Next = &ListNode{Val: sum % 10}
		cur, l1, l2, carry = cur.Next, l1.Next, l2.Next, sum/10
	}
	return res.Next
}

func main() {
	l1 := new(ListNode)
	l1.Init([]int{2, 4, 3})
	l2 := new(ListNode)
	l2.Init([]int{5, 6, 4})
	r := addTwoNumbers(l1.Next, l2.Next)
	r.Show()

	//
	fmt.Println("")
	fmt.Println("case 2")
	l1 = new(ListNode)
	l1.Init([]int{9, 9, 9, 9, 9, 9, 9})
	l2 = new(ListNode)
	l2.Init([]int{9, 9, 9, 9})
	l2.Show()
	r = addTwoNumbers(l1.Next, l2.Next)
	r.Show()

}
